#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX_LEN 250

// 字符串反转函数
void reverse(char* str) {
    int len = strlen(str);
    for (int i = 0; i < len / 2; i++) {
        char temp = str[i];
        str[i] = str[len - 1 - i];
        str[len - 1 - i] = temp;
    }
}

// 模拟手工乘法运算
void multiply_manual(char* num1, char* num2, char* result) {
    int len1 = strlen(num1);
    int len2 = strlen(num2);
    int res[MAX_LEN] = {0};
    
    // 反转字符串以便从低位开始计算
    reverse(num1);
    reverse(num2);
    
    // 逐位相乘并累加
    for (int i = 0; i < len1; i++) {
        for (int j = 0; j < len2; j++) {
            res[i + j] += (num1[i] - '0') * (num2[j] - '0');
        }
    }
    
    // 处理进位
    for (int i = 0; i < len1 + len2; i++) {
        if (res[i] >= 10) {
            res[i + 1] += res[i] / 10;
            res[i] %= 10;
        }
    }
    
    // 找到结果的长度
    int len = len1 + len2;
    while (len > 1 && res[len - 1] == 0) len--;
    
    // 转换为字符串
    for (int i = 0; i < len; i++) {
        result[len - 1 - i] = res[i] + '0';
    }
    result[len] = '\0';
    
    // 恢复原字符串顺序
    reverse(num1);
    reverse(num2);
}

// 直接乘法运算（适用于较小的数）
void multiply_direct(char* num1, char* num2, char* result) {
    // 仍然使用模拟方法，因为C语言没有内置的大整数类型
    multiply_manual(num1, num2, result);
}

int main() {
    // char num1[MAX_LEN], num2[MAX_LEN];
    // char result1[MAX_LEN], result2[MAX_LEN];
    
    // printf("请输入第一个大整数: ");
    // scanf("%s", num1);
    
    // printf("请输入第二个大整数: ");
    // scanf("%s", num2);
    
    // // 方法一：模拟手工乘法
    // multiply_manual(num1, num2, result1);
    // printf("模拟手工乘法结果: %s\n", result1);
    
    // // 方法二：直接乘法运算（这里也使用模拟方法）
    // multiply_direct(num1, num2, result2);
    // printf("直接乘法运算结果: %s\n", result2);
    
    // 示例计算
    printf("\n示例计算:\n");
    char example1[] = "1234567";
    char example2[] = "123";
    char example_result[MAX_LEN];
    
    multiply_manual(example1, example2, example_result);
    printf("%s * %s = %s\n", example1, example2, example_result);
    
    char big_num1[] = "1234567891011121314151617181920";
    char big_num2[] = "2019181716151413121110987654321";
    char big_result[MAX_LEN];
    
    multiply_manual(big_num1, big_num2, big_result);
    printf("%s * %s = %s\n", big_num1, big_num2, big_result);
    
    return 0;
}